﻿using System; 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using Yanesdk.Draw;

namespace ADV_Evaluator {

    public partial class MainForm : Form {

        private GameSystem system;
        private Win32Window window;
        private bool timerLock;

        public Win32Window Window {
            get { return window; }
        }
        public Screen2DGl Screen {
            get { return window.Screen; }
        }
        public PictureBox PictureBox {
            get { return pictureBox; }
        }

        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="system"></param>
        public MainForm(GameSystem system) {
            InitializeComponent();
            this.system = system;
            this.ClientSize = new System.Drawing.Size(system.ProjectData.WindowWidth, system.ProjectData.WindowHeight);
            window = new Win32Window(pictureBox.Handle);
            window.Screen.SetClearColor(0, 0, 0);
            timerLock = false;
        }

        /// <summary>
        /// 解放処理
        /// </summary>
        private new void Dispose() {
            window.Dispose();
            base.Dispose();
        }

        /// <summary>
        /// フォームが閉じられた後
        /// </summary>
        private void MainForm_FormClosed(object sender, FormClosedEventArgs e) {
            // メインループ終了
            timer.Stop();
            // 解放
            Dispose();
        }
        /// <summary>
        /// フォームが表示されたとき
        /// </summary>
        private void MainForm_Load(object sender, EventArgs e) {
            // メインループ開始
            timer.Start();
        }

        /// <summary>
        /// タイマによって定期的に呼ばれるメソッド。
        /// </summary>
        private void timer_Tick(object sender, EventArgs e) {
            // MessageBox.Showとかしたときに再帰的に呼ばれないようにロック
            if (timerLock) return;
            timerLock = true;
            try {
                if (system.FpsTimer.ToBeRendered) {
                    system.FpsTimer.WaitFrame();
                    // タスクから終了が伝えられていればフォームを閉じる
                    if (system.TaskController.End) {
                        Dispose();
                    // タスクの処理を優先度順(Priorityが小さい順)に実行
                    } else {
                        system.TaskController.CallTask(system);
                    }
                }
            } finally {
                timerLock = false;
            }
        }

    }

}